package main

import "fmt"

/*
删除链表的倒数第N个节点
给你一个链表，删除链表的倒数第 n 个结点，并且返回链表的头结点。

输入：head = [1,2,3,4,5], n = 2
输出：[1,2,3,5]
*/

type ListNode struct {
	Val  int
	Next *ListNode
}

//快慢指针
/*
快指针先走n部
快慢指针再一起走
当快指针走到最后一个节点时 慢指针走到倒数第N个节点的1前一个结点
*/
/*
func removeNthFromEnd(head *ListNode, n int) *ListNode {
    new := &ListNode{Next:head}
    l,r := new,new
    for i:=0;i<n;i++{
        r = r.Next
    }
    for r.Next != nil{
        l = l.Next
        r = r.Next
    }
    l.Next = l.Next.Next
    return new.Next
}
*/

//顺序查找
//假设当前链表的长度为n，则我们知道链表的倒数第k个节点即为正数第n−k个节点，
//此时我们只需要顺序遍历到链表的第n−k 个节点即为倒数第 k 个节点。
//首先求出链表的长度n，然后顺序遍历到链表的第n−k 个节点返回即可。
func getLength(head *ListNode) (length int) {
	for ; head != nil; head = head.Next {
		length++
	}
	return
}

func removeNthFromEnd(head *ListNode, n int) *ListNode {
	length := getLength(head)
	dummy := &ListNode{0, head}
	cur := dummy
	for i := 0; i < length-n; i++ {
		cur = cur.Next
	}
	cur.Next = cur.Next.Next
	return dummy.Next
}

func main() {
	s := &ListNode{
		Val: 7,
		Next: &ListNode{
			Val: 4,
			Next: &ListNode{
				Val:  5,
				Next: nil,
			},
		},
	}
	fmt.Println(removeNthFromEnd(s, 2))
}
